package algorithm.middle;

import com.sun.javafx.tk.TKClipboard;

import javax.swing.*;
import java.util.HashMap;
import java.util.Map;

/**
 * 给你一个在 X-Y 平面上的点构成的数据流。设计一个满足下述要求的算法：
 * <p>
 * 添加 一个在数据流中的新点到某个数据结构中。可以添加 重复 的点，并会视作不同的点进行处理。
 * 给你一个查询点，请你从数据结构中选出三个点，使这三个点和查询点一同构成一个 面积为正 的 轴对齐正方形 ，统计 满足该要求的方案数目。
 * 轴对齐正方形 是一个正方形，除四条边长度相同外，还满足每条边都与 x-轴 或 y-轴 平行或垂直。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/detect-squares
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class DetectSquares {

    //{x,{y,number}}
    private Map<Integer, Map<Integer, Integer>> data;


    public DetectSquares() {
        data = new HashMap<>();
    }

    public void add(int[] point) {
        int x = point[0];
        int y = point[1];
        Map<Integer, Integer> list = data.getOrDefault(x, new HashMap<>());
        list.put(y, list.getOrDefault(y, 0) + 1);
        data.put(x, list);
    }

    public int count(int[] point) {
        int x = point[0];
        int y = point[1];
        Map<Integer, Integer> yMap = data.get(x);
        if (yMap == null) {
            return 0;
        }
        int res = 0;
        for (Map.Entry<Integer, Integer> entry : yMap.entrySet()) {
            Integer key = entry.getKey();
            int abs = Math.abs(y - key);
            if (abs == 0) continue;
            Map<Integer, Integer> leftMap = data.get(x - abs);
            if (leftMap != null) {
                Integer orDefault = leftMap.getOrDefault(y, 0);
                if (orDefault > 0) {
                    res = res + orDefault * leftMap.getOrDefault(key, 0) * entry.getValue();
                }
            }
            Map<Integer, Integer> rightMap = data.get(x + abs);
            if (rightMap != null) {
                Integer orDefault = rightMap.getOrDefault(y, 0);
                if (orDefault > 0) {
                    res = res + orDefault * rightMap.getOrDefault(key, 0) * entry.getValue();
                }
            }
        }
        return res;
    }

    public static void main(String[] args) {
        DetectSquares detectSquares = new DetectSquares();
//        detectSquares.add(new int[]{3, 10});
//        detectSquares.add(new int[]{11, 2});
//        detectSquares.add(new int[]{3, 2});
//        detectSquares.count(new int[]{11, 10});
//        detectSquares.count(new int[]{14, 8});
//        detectSquares.add(new int[]{11, 2});
//        detectSquares.count(new int[]{11, 10});
    }

}
